package com.sky.category.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.category.mapper.CategoryMapper;
import com.sky.category.service.CategoryService;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.context.AlibabaTTL;
import com.sky.dish.mapper.DishMapper;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.result.PageResult;
import com.sky.setmeal.mapper.SetMealMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 分类管理 CategoryServiceImpl
 */
@Slf4j
@Service
public class CategoryServiceImpl implements CategoryService {

    @Resource
    private CategoryMapper categoryMapper;

    @Resource
    private DishMapper dishMapper;

    @Resource
    private SetMealMapper setMealMapper;



    /**
     * 分类管理
     *        添加分类
     * @param categoryDTO
     */
    @Override
    public void addCategory(CategoryDTO categoryDTO) {
        // 1.模型拷贝 补充字段
        Category category = JSON.parseObject(JSON.toJSONString(categoryDTO, SerializerFeature.WriteMapNullValue), Category.class);
        category.setStatus(StatusConstant.DISABLE);
                //Aop解决
                //.setCreateTime(LocalDateTime.now())
                //.setUpdateTime(LocalDateTime.now())
                //.setCreateUser(Long.valueOf(AlibabaTTL.threadLocalGet().toString()))
                //.setUpdateUser(Long.valueOf(AlibabaTTL.threadLocalGet().toString()));
        // 2.调用方法
        Integer count = categoryMapper.insert(category);
        log.info("新增分类，影响行数: {}", count);
    }



    /**
     * 分类管理
     *        分页条件查询
     * @param categoryPageQueryDTO
     */
    @Override
    public PageResult pageQuery(CategoryPageQueryDTO categoryPageQueryDTO) {
        // 1.PageHelper设置分页参数 ， 排序参数
        PageHelper.startPage(categoryPageQueryDTO.getPage(), categoryPageQueryDTO.getPageSize(), "sort asc,create_time desc");

        // 2.查询返回的集合 封装为PageHelper的数据集合
        Page<Category> page = categoryMapper.selectPage(categoryPageQueryDTO);

        // 3.封装返回数据
        return new PageResult(page.getTotal(), page.getResult());
    }



    /**
     * 分类管理
     *        启用、禁用
     * @param status
     * @param id
     */
    @Override
    public void startOrStop(Long id, Integer status) {
        // 1.封装数据
        Category category = Category.builder().id(id).status(status).build();
        // 2.调用方法
        Integer count = categoryMapper.updateById(category);
        log.info("id:{} ,修改分类数据，影响行数: {}", id, count);
    }



    /**
     * 分类管理
     *        修改分类信息
     * @param categoryDTO
     */
    @Override
    public void updateById(CategoryDTO categoryDTO) {
        // 1.数据拷贝 并 补充字段
        Category category = JSON.parseObject(JSON.toJSONString(categoryDTO, SerializerFeature.WriteMapNullValue), Category.class);
        //Aop解决
        //category.setUpdateTime(LocalDateTime.now()).setUpdateUser(Long.valueOf(AlibabaTTL.threadLocalGet().toString()));

        // 2.调用方法
        Integer count = categoryMapper.updateById(category);
        log.info("id：{}, 编辑分类信息,影响行数: ==> {}", categoryDTO.getId(), count);
    }



    /**
     * 分类管理
     *         根据id删除
     * @param id
     */
    @Override
    public void deleteById(Long id) {
        Integer count = 0;
        // 1.查询当前分类下有没有关联菜品
        count = dishMapper.countByCategoryId(id);
        if(count > 0){
            //关联了菜品，不能删除，抛出异常
            throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_DISH + count);
        }

        // 2.查询当前分类下有没有关联套餐
        count = setMealMapper.countByCategoryId(id);
        if(count > 0){
            //关联了套餐，无法删除，抛出异常
            throw new DeletionNotAllowedException(MessageConstant.CATEGORY_BE_RELATED_BY_SETMEAL + count);
        }

        // 3.没有关联，删除分类
        count = categoryMapper.deleteById(id);
        log.info("id: {},删除分类影响行数: ==> {}", id, count);
    }



    /**
     * 分类管理
     *        根据类型查询分类列表  type: 1菜品 2套餐
     * @param type
     */
    @Override
    public List<Category> selectCategoryListByType(Integer type) {
        return categoryMapper.selectCategoryListByType(type);
    }


}
